import numpy as np
from bid_functions.auction import auction
def bidding(nt, nm, F, e, x1, y1):
    """
    实现拍卖分配过程的Python版本
    
    参数:
    nt -- 目标数量
    nm -- 导弹数量
    F  -- 出价矩阵 (目标×导弹)
    e  -- 拍卖增量
    x1, y1 -- 记录拍卖过程的变量
    
    返回:
    H -- 分配向量 (每个导弹分配的目标)
    X -- 分配矩阵 (独热编码)
    f -- 总价值
    x1_out, y1_out -- 更新的拍卖过程记录
    """
    # 计算分配轮次和余数
    times = np.ceil(nm / nt).astype(int)  # 分配轮次
    surplus = nm % nt                     # 最后一轮分配的导弹数
    
    # 初始化拍卖过程变量
    hehe = 0
    he = 0
    hehenum = 0
    
    # 初始化分配结果向量
    H = np.zeros(nm, dtype=int)
    
    # 分轮次进行拍卖
    for i in range(1, times + 1):
        # 确定当前轮次的导弹范围
        start_idx = (i - 1) * nt
        if i != times:
            end_idx = i * nt
            w = F[:, start_idx:end_idx]  # 取nt个导弹
        else:
            end_idx = nm
            w = F[:, start_idx:end_idx]  # 取剩余导弹
        
        # 初始化拍卖变量
        p = np.zeros(w.shape[1])   # 当前价格向量
        won = np.zeros(w.shape[1], dtype=int)  # 分配结果
        q = np.arange(1, nt + 1)   # 目标队列 (1到nt)
        
        # 调用拍卖函数
        p, won, q, he, hehe, hehenum, x1, y1 = auction(
            p, won, q, e, w, he, hehe, hehenum, x1, y1
        )
        
        # 存储当前轮次的分配结果
        H[start_idx:end_idx] = won
    
    # 构建分配矩阵 (目标×导弹)
    X = np.zeros((nt, nm), dtype=int)
    for j in range(nm):
        target_idx = H[j] - 1  # 目标索引 (从0开始)
        if target_idx >= 0:    # 确保有分配
            X[target_idx, j] = 1
    
    # 计算总价值
    f = 0
    for j in range(nm):
        target_idx = H[j] - 1  # 目标索引
        if target_idx >= 0:    # 确保有分配
            f += F[target_idx, j]  # 目标j对导弹i的出价
    
    return H, X, f, x1, y1